import { AnimatePresence } from 'motion/react';
import { MouseEvent, useMemo, useState } from 'react';
import { Link } from 'react-router';

import styles from './item-detail.module.css';

import { ItemCardControls } from '/@/renderer/components/item-card/item-card-controls';
import { useFastAverageColor } from '/@/renderer/hooks';
import { ActionIcon } from '/@/shared/components/action-icon/action-icon';
import { Badge } from '/@/shared/components/badge/badge';
import { Divider } from '/@/shared/components/divider/divider';
import { Group } from '/@/shared/components/group/group';
import { Image } from '/@/shared/components/image/image';
import { Rating } from '/@/shared/components/rating/rating';
import { Text } from '/@/shared/components/text/text';
import {
    Album,
    AlbumArtist,
    Artist,
    LibraryItem,
    Playlist,
    Song,
} from '/@/shared/types/domain-types';
import { stringToColor } from '/@/shared/utils/string-to-color';

interface ItemDetailProps {
    data: Album | AlbumArtist | Artist | Playlist | Song | undefined;
    itemHeight: number;
    itemType: LibraryItem;
    onClick?: (e: MouseEvent<HTMLDivElement>, item: unknown, itemType: LibraryItem) => void;
    withControls?: boolean;
}

export const ItemDetail = ({ data, itemType, onClick, withControls }: ItemDetailProps) => {
    const imageUrl = getImageUrl(data);

    const [showControls, setShowControls] = useState(false);

    const { background } = useFastAverageColor({
        algorithm: 'simple',
        src: imageUrl,
        srcLoaded: false,
    });

    // const tags = [...(data?.genres ?? [])];

    const tags = useMemo(() => {
        if (!data) {
            return [];
        }

        const items: {
            color?: string;
            id: string;
            isLight?: boolean;
            itemType: LibraryItem;
            name: string;
        }[] = [];

        if ('albumArtists' in data && Array.isArray(data.albumArtists)) {
            data.albumArtists?.forEach((tag: { id: string; name: string }) => {
                items.push({ id: tag.id, itemType: LibraryItem.ALBUM_ARTIST, name: tag.name });
            });
        }

        if ('genres' in data && Array.isArray(data.genres)) {
            data.genres?.forEach((tag: { id: string; itemType: LibraryItem; name: string }) => {
                const { color, isLight } = stringToColor(tag.name);
                items.push({ ...tag, color, isLight });
            });
        }

        // if ('tags' in data && typeof data.tags === 'object') {
        //     console.log('data.tags :>> ', data.tags);
        //     Object.entries(data.tags).forEach(([key, value]) => {
        //         items.push({ id: key, itemType: LibraryItem.TAG, name: value });
        //     });
        // }

        return items;
    }, [data]);

    return (
        <div
            className={styles.container}
            onClick={(e) => onClick?.(e, data, itemType)}
            style={{ backgroundColor: background }}
        >
            <div
                className={styles.imageContainer}
                onMouseEnter={() => withControls && setShowControls(true)}
                onMouseLeave={() => withControls && setShowControls(false)}
            >
                <Image alt={data?.name} src={imageUrl} />
                <AnimatePresence>
                    {withControls && showControls && <ItemCardControls type="compact" />}
                </AnimatePresence>
            </div>
            <div className={styles.metadataContainer}>
                <div className={styles.header}>
                    <Text className={styles.title} component={Link} isLink size="lg" weight={500}>
                        {data?.name}
                    </Text>
                    <Group>
                        {data && 'userRating' in data && (
                            <Rating size="xs" value={data?.userRating ?? 0} />
                        )}
                        {data && 'userFavorite' in data && (
                            <ActionIcon
                                icon="favorite"
                                iconProps={{
                                    fill: data?.userFavorite ? 'primary' : 'default',
                                }}
                                size="xs"
                            />
                        )}
                    </Group>
                </div>
                <Divider />
                <div className={styles.content}>
                    <Group className={styles.tags} gap="xs">
                        {tags.map((tag) => (
                            <Badge
                                key={tag.id}
                                style={{
                                    backgroundColor: tag.color,
                                    color: tag.isLight ? 'black' : 'white',
                                }}
                            >
                                {tag.name}
                            </Badge>
                        ))}
                    </Group>
                </div>
            </div>
        </div>
    );
};

const getImageUrl = (data: Album | AlbumArtist | Artist | Playlist | Song | undefined) => {
    if (data && 'imageUrl' in data) {
        return data.imageUrl || undefined;
    }

    return undefined;
};
